"""
字典介绍（类似java 中的 map。属于 k-v 形式。但是在 python3 中 字典 key 是有序的，不像 Java 中的 map 是无序的）
"""

# 1. 字典的定义1
d = {}
print(type(d))
print(d)

# 2. 字典的定义2
dict1 = dict()
print(type(dict1))
print(dict1)

# 3. 字典定义并初始化1
d1 = {'1': 1, '2': '2', 3: [111, 22]}
print(type(d1))
print(d1)

# 4. 字典定义并初始化2
dict2 = dict(a='a', b='b', t='t')
print(type(dict2))
print(dict2)
# 也可以通过 元组 + 列表 的形式来初始化
dict_dict = dict([(1, 2), (2, 2.3), (3, [23434, '43434', 2.3]), (4, (2, 1, 2, 3, 3, 3))])
print(type(dict_dict))
print(dict_dict)

# 5. 需要注意，字典的 key 不能是可变对象，例如列表。value 没有限制
# 如下方式将会报错：unhashable type: 'list'
# d2 = {[1, 2, 3]: 1}
# 元组是不可变对象，可以作为key
d2 = {(1, 2, 3): 111}
print(type(d2))
print(d2)

# 6. 获取字典指定key 对应的 value 值
d3 = {'1': 1, '2': '2', 3: [111, 22], 10: 222, 222: 10}
print(d3['1'])
print(d3[3])

# 7. len 获取字典长度
print(len(d3))

# 8. 通过 key 修改 value 的值
d3['1'] = '通过 key 修改 value 的值'
print(d3)

# 9. 通过 del 、pop() 、popitem() 删除指定 key 的键值对
# 通过 del 删除
del d3['1']
print(d3)
# 通过 pop() 删除
pop = d3.pop('2')
print(pop)
print(d3)
# pop() 如果删除的key 在字典中不存在，将会报错。所以可以通过指定返回指定值防止报错
d__pop = d3.pop(4, 'key 为 4 的键值对不存在，指定返回值防止报错')
print(d__pop)
print(d3)
# 通过 popitem() 删除字典位于最后位置的一个键值对，并通过元祖的形式返回 键值对
popitem = d3.popitem()
print(popitem)
print(d3)

# 10. 通过 in 检查指定 key 是否在 字典中
print('1' in d3)
print(3 in d3)

# 11. get() 获取值。通过 6 中 指定key 对应的 value 值方式，如果键不存在将报错，而get()不会
d4 = {'1': 1, '2': '2', 3: [111, 22]}
# 通过此方式将报错
# print(d4[4])
# 通过此方式将不会报错，如果不存在指定的可以，那么将返回None
print(d4.get(4))
print(d4.get('1'))
# 还可以设置，如果不存在指定key，返回指定的值
get = d4.get(4, '这个key不存在，设置返回值')
print(get)
print(d4)

# 12. setDefault()。如果指定key不存在，那么加入key 和 指定的默认值 的键值对到字典中，并返回存在key的值或不存在 key 的 default 值
# key 存在的情况下，就不会设置
print(d4)
setdefault = d4.setdefault('1', '设置默认值')
print(setdefault)
print(d4)
# key 不存在的情况下，将会操作
d__setdefault = d4.setdefault(4)
print(d__setdefault)
print(d4)
i = d4.setdefault(5, '默认不指定时为None，指定的话就是指定的值')
print(d4)
print(i)

# 13. update() 增加键值对
d5 = {'1': 1, '2': '2', 3: [111, 22]}
# 通过元祖列表增加
d5.update([(22, '22'), ('22', 22)])
print(d5)
# 通过字典添加
d6 = {'11': 1, '12': '2', 13: [111, 22]}
d5.update(d6)
print(d5)
